/**
 * 
 */
package com.toncen.samepms.fisher.formatter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.sky.common.string.StringUtils;
import com.sky.fisher.filter.Options;
import com.sky.fisher.formatter.AbstractFormatter;
import com.sky.fisher.model.CommonColumnModel;
import com.sky.fisher.query.AbstractQuery;
import com.sky.fisher.service.FisherService;

/**
 * 描述：枚举格式化器
 * 
 * @author tch
 * 
 */
public class EnumFormatter extends AbstractFormatter {
	/**
	 * 获取枚举内容SQL参数名称
	 */
	public static String PARAMETER_SQL = "sql";

	/**
	 * 枚举key字段参数名称
	 */
	public static String PARAMETER_KEY_COLUMN = "key";

	/**
	 * 枚举value字段参数名称
	 */
	public static String PARAMETER_VALUE_COLUMN = "value";

	/**
	 * 
	 */
	public EnumFormatter() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sky.fisher.formatter.AbstractFormatter#format(com.sky.fisher.model.CommonColumnModel,
	 *      java.lang.String)
	 */
	@Override
	public String format(CommonColumnModel column, String source) throws Exception {
		if (!StringUtils.isEmpty(source)) {
			List<Options> valueOptions = getEnum(column);
			for (Options option : valueOptions) {
				if (source.equals(option.getValue())) {
					return option.getName();
				}
			}
		}
		return "";
	}

	/**
	 * 获取枚举
	 * 
	 * @param column
	 * @return
	 * @throws Exception
	 */
	public static List<Options> getEnum(CommonColumnModel column) throws Exception {
		String sql = column.getParameterMap().get(EnumFormatter.PARAMETER_SQL);
		String key = column.getParameterMap().get(EnumFormatter.PARAMETER_KEY_COLUMN);
		String value = column.getParameterMap().get(EnumFormatter.PARAMETER_VALUE_COLUMN);
		if (StringUtils.isEmpty(sql)) {
			throw new Exception("获取枚举内容SQL参数【" + EnumFormatter.PARAMETER_SQL + "】没有设置，请与系统管理员联系！");
		}
		if (StringUtils.isEmpty(key)) {
			key = "ID";
			logger.debug("枚举key字段参数【" + EnumFormatter.PARAMETER_KEY_COLUMN + "】没有设置，系统使用默认值【" + key + "】！");
		}
		if (StringUtils.isEmpty(value)) {
			value = "NAME";
			logger.debug("枚举value字段参数【" + EnumFormatter.PARAMETER_VALUE_COLUMN + "】没有设置，系统使用默认值【" + value + "】！");
		}
		AbstractQuery query = FisherService.getConnectionProvider(column.getGrid()).getQuery();
		List<Map<String, String>> results = query.executeQuery(sql);
		List<Options> valueOptions = new ArrayList<Options>();
		for (Map<String, String> row : results) {
			if (!row.containsKey(key.toUpperCase())) {
				throw new Exception("当前查询SQL返回结果中没有key字段【" + key.toUpperCase() + "】，请与系统管理员联系！");
			}
			if (StringUtils.isEmpty(row.get(key.toUpperCase()))) {
				throw new Exception("当前查询SQL返回结果中key字段【" + key.toUpperCase() + "】值为空，请与系统管理员联系！");
			}
			if (!row.containsKey(value.toUpperCase())) {
				throw new Exception("当前查询SQL返回结果中没有value字段【" + value.toUpperCase() + "】，请与系统管理员联系！");
			}
			if (StringUtils.isEmpty(row.get(value.toUpperCase()))) {
				throw new Exception("当前查询SQL返回结果中value字段【" + value.toUpperCase() + "】值为空，请与系统管理员联系！");
			}
			valueOptions.add(new Options(row.get(key.toUpperCase()), row.get(value.toUpperCase())));
		}
		return valueOptions;
	}

}
